package objetos.proyectiles;

import juego.Escenario;
import movimiento.Posicion;
import movimiento.patrones.*;
import objetos.*;
import org.jdom.*;
import vistas.FactoryVistas;
import ar.uba.fi.algo3.titiritero.ControladorJuego;
import ar.uba.fi.algo3.titiritero.vista.Imagen;
import auxiliares.Vector;

/*
 * Clase que modela los torpedos rastreadores.
 */
public class Rastreador extends Proyectil {
	private ObjetoMovil objetivo;

	public Rastreador(ObjetoMovil origen, ObjetoMovil objetivo) {
		super(origen);
		setPatron(new Rastrear(objetivo));
		getVelocidad().setComponenteX(3);
		setPoder(new Danio(50));
		this.objetivo = objetivo;
	}

	public Rastreador(ObjetoMovil origen, ObjetoMovil objetivo,
			Posicion posicion) {
		this(origen, objetivo);
		setPosicion(posicion);
	}

	public Rastreador(ObjetoMovil origen, ObjetoMovil objetivo, int x, int y) {
		this(origen, objetivo, new Posicion(x, y));
	}

	public void setObjetivo(ObjetoMovil objetivo) {
		this.objetivo = objetivo;
	}

	public ObjetoMovil getObjetivo() {
		return objetivo;
	}

	@Override
	public Imagen darVista(ControladorJuego controlador) {
		return FactoryVistas.crearVista(this, controlador);
	}

	@Override
	public void vivir() {
		/* Si no tiene objetivo pide uno nuevo al Escenario. */
		if (this.objetivo == null || this.objetivo.estaDestruido()) {
			this.objetivo = Escenario.getInstance().darObjetivoPara(
					this.getOrigen());
		}
		super.vivir();
	}

	/* Persistencia */

	/* Constructor a partir de nodoXML */
	public Rastreador(Element nodo) {
		super();
		setTamanio(5);

		setPatron(new Rectas());
		setPoder(new Danio(50));

		int pX = Integer.parseInt(nodo.getAttributeValue("posicionX"));
		int pY = Integer.parseInt(nodo.getAttributeValue("posicionY"));
		this.setPosicion(new Posicion(pX, pY));

		int vX = Integer.parseInt(nodo.getAttributeValue("velocidadX"));
		int vY = Integer.parseInt(nodo.getAttributeValue("velocidadY"));
		setVelocidad(new Vector(vX, vY));

		if (Boolean.valueOf(nodo.getAttributeValue("esObjetivoAlgo42"))) {
			this.objetivo = Escenario.getInstance().getActor();
		} else {
			this.objetivo = Escenario.getInstance().obtenerEnemigo();
		}
	}

	/* NodoXML a partir de instancia */
	@Override
	public Element obtenerNodo() {
		Element nodo = new Element("rastreador");
		nodo.setAttribute(new Attribute("posicionX", Integer.toString(this
				.getPosicion().getEnX())));
		nodo.setAttribute(new Attribute("posicionY", Integer.toString(this
				.getPosicion().getEnY())));
		nodo.setAttribute(new Attribute("velocidadX", Integer.toString(this
				.getVelocidad().getComponenteX())));
		nodo.setAttribute(new Attribute("velocidadY", Integer.toString(this
				.getVelocidad().getComponenteY())));
		nodo.setAttribute(new Attribute("esObjetivoAlgo42", String.valueOf(this
				.esEnemigo())));
		return nodo;
	}

}
